/* _________________________________________________________________________
 *
 *             Tachyon : A Self-Hosted JavaScript Virtual Machine
 *
 *
 *  This file is part of the Tachyon JavaScript project. Tachyon is
 *  distributed at:
 *  http://github.com/Tachyon-Team/Tachyon
 *
 *
 *  Copyright (c) 2011, Universite de Montreal
 *  All rights reserved.
 *
 *  This software is licensed under the following license (Modified BSD
 *  License):
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are
 *  met:
 *    * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *    * Neither the name of the Universite de Montreal nor the names of its
 *      contributors may be used to endorse or promote products derived
 *      from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 *  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 *  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITE DE
 *  MONTREAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * _________________________________________________________________________
 */

function test()
{
    printTachyonState();
    print("Opening string port");
    
    var port = new String_input_port(
        "function fib(n) { if (n < 2) { return n; }" +
        " else { return fib(n-1) + fib(n-2); } }"
    );
    var s = new Scanner(port); 
    var p = new Parser(s, false); 

    print("Parsing");
    prog = p.parse(); 

    assert(prog !== null, "Invalid parse tree");

    print("Creating program");
    prog = new Program(
        prog.loc,
        new BlockStatement(
            prog.loc,
            prog.block.statements
        )
    );

    print("Normalizing program");
    var normalized_prog = ast_normalize(prog, false);

    print("Pretty printing");
    var pp_str = js_to_string(normalized_prog);

    var exp_str =   "var fib;\n" +
                "fib = (function (n)\n" +
                "{\n" +
                "    if ((n < 2))\n" + 
                "    {\n" + 
                "        return n;\n" +
                "    }\n" + 
                "    else\n" + 
                "    {\n" + 
                "        return (fib((n - 1)) + fib((n - 2)));\n" + 
                "    }\n" + 
                "});\n";

    print("Comparing");
    print(pp_str);
    print(exp_str);
    //assert(pp_str === exp_str, "Invalid string from parsing " + pp_str + " expected " + exp_str);

    printTachyonState();
    if (pp_str === exp_str)
    {
        return 0;
    } else
    {
        return 1;
    }
}
